[bits 64]

code_selector equ (1 << 3)
data_selector equ (2 << 3)
tss_selector  equ (8 << 3)

global _start
extern console_init
extern memory_init
extern kernel_init
_start:
    ; 初始化GDT
    lgdt [GDT_Pointer]
    push rdi    ; 保存参数
    call console_init
    pop rdi     ; 恢复参数
    call memory_init
    call kernel_init
    jmp $
    ud2 ; 不可能到达这里

global GDT_Table
    align 16    ; 对齐16字节
GDT_Table:
    dq 0x0000000000000000   ; NULL descriptor
    dq 0x0020980000000000   ; Kernel Code 64-bit
    dq 0x0020920000000000   ; Kernel Data 64-bit
    dq 0x0020f80000000000   ; User Code 64-bit
    dq 0x0020f20000000000   ; User Data 64-bit
    dq 0x00cf9a000000ffff   ; Kernel Code 32-bit
    dq 0x00cf92000000ffff   ; Kernel Data 32-bit
    times 72    db 0
GDT_END:

global GDT_Pointer
GDT_Pointer:
    dw ((GDT_END - GDT_Table) - 1)
    dq GDT_Table

global TSS_Table
    align 4    ; 对齐4字节
TSS_Table:
    times 104   db 0
TSS_END:

global TSS_Selector
    align 4    ; 对齐4字节
TSS_Selector:
    dw tss_selector
